<?php
/**
 * This class represent a group in the system.
 * The corresponding table in the database is "cb_groupes",
 * represented by Application_Model_GroupesTable.
 * @package fr.ec-lyon.aeecl.codebar.application.model
 * @subpackage group
 * @author Théo Chamley
 */
class Application_Model_Groupe {

	protected static $_dbTable;
	protected static $_dbTableClass = 'Application_Model_GroupesTable';

	const ADMIN_GROUP_ID = 1;

	protected $nom;
	protected $id_groupe;
	protected $code;
	protected $liste_id_produits;
	protected $liste_folder_produits;
	protected $liste_nom_produits;
	protected $liste_prix;
	protected $liste_prix_espece;
	protected $liste_prix_special;
	protected $liste_folders;
	protected $liste_folders_id;
	protected $liste_bs;
	protected $bs_auto;

	/**
	 *
	 * Set the table name for Application_Model_Groupe
	 * @param String $dbTable the name of the class representing the table
	 * @throws Exception
	 */
	public static function setDbTable($dbTable) {
		if (is_string($dbTable)) {
			$dbTable = new $dbTable();
		}
		if (!$dbTable instanceof Zend_Db_Table_Abstract) {
			throw new Exception('Invalid table data gateway provided');
		}
		self::$_dbTable = $dbTable;
	}

	/**
	 *
	 * Get the table of the data base.
	 * @return the table of the database.
	 */
	public static function getDbTable() {
		if (null === self::$_dbTable) {
			self::setDbTable(self::$_dbTableClass);
		}
		return self::$_dbTable;
	}

	public function Application_Model_Groupe($name='',$id='',$code='')
	{
		$this->nom= $name;
		$this->id_groupe=$id;
		$this->code = $code;
	}
	
	/**
	 * 
	 * Gives the name from the id of the group
	 * @param int $id
	 * @return Application_Model_Group with the name filled
	 */
	public static function getGroupById($id)
	{
		$table = self::getDbTable();
		$rows = $table->fetchAll($table->select()->where('id_groupe = ?', $id));
		if(count($rows) == 1) {
			return self::getGroupFromRow($rows[0]);
		} else {
			throw new Zend_Exception("Le groupe ".$id." n'existe pas.");
		}
	}

	//TODO remplacer tous les appels à cette méthode par des appels à getGroupById
	public function getByID($id)
	{
		$g = new Application_Model_GroupesTable();
		$rows = $g->fetchAll($g->select()->where('id_groupe = ?',$id));
		$this->nom = $rows[0]['nom'];
		$this->code = $rows[0]['code'];
		$this->id_groupe = $id;
		if($rows[0]['bs1'] != NULL)
		{
			$this->liste_bs[] = $rows[0]['bs1'];
		}
		if($rows[0]['bs2'] != NULL)
		{
			$this->liste_bs[] = $rows[0]['bs2'];
		}
		if($rows[0]['bs3'] != NULL)
		{
			$this->liste_bs[] = $rows[0]['bs3'];
		}
		$this->bs_auto = $rows[0]['bs_auto'];
		return $this;
	}

	public static function getByIdGroup($id) {
		$element = new Application_Model_Groupe();
		$g = new Application_Model_GroupesTable();
		$rows = $g->fetchAll($g->select()->where('id_groupe = ?',$id));
		$element->nom = $rows[0]['nom'];
		$element->code = $rows[0]['code'];
		$element->id_groupe = $id;
		if($rows[0]['bs1'] != NULL)
		{
			$element->liste_bs[] = $rows[0]['bs1'];
		}
		if($rows[0]['bs2'] != NULL)
		{
			$element->liste_bs[] = $rows[0]['bs2'];
		}
		if($rows[0]['bs3'] != NULL)
		{
			$element->liste_bs[] = $rows[0]['bs3'];
		}
		$element->bs_auto = $rows[0]['bs_auto'];
		return $element;
	}

	public function getByName($name)
	{
		$g = new Application_Model_GroupesTable();
		$rows = $g->fetchAll($g->select()->where('nom = ?',$name));
		$this->id_groupe = $rows[0]['id_groupe'];
		$this->code = $rows[0]['code'];
		$this->nom = $name;
		return $this;
	}

	public function getID()
	{
		return $this->id_groupe;
	}
	
	public function setId($id)
	{
		$this->id_groupe = $id;
		return $this;
	}

	public function getName()
	{
		return $this->nom;
	}

	public function setName($name)
	{
		$this->nom = $name;
		return $this;
	}

	public function getCode()
	{
		return $this->code;
	}

	public function setCode($code)
	{
		$this->code = $code;
		return $this;
	}

	public function getListeIdProduits()
	{
		return$this->liste_id_produits;
	}

	public function getListeFolderProduits()
	{
		return $this->liste_folder_produits;
	}

	public function getListeNomProduits()
	{
		return $this->liste_nom_produits;
	}

	public function getListePrix()
	{
		return $this->liste_prix;
	}

	public function getListePrixEspece()
	{
		return $this->liste_prix_espece;
	}

	public function getListePrixSpecial()
	{
		return $this->liste_prix_special;
	}

	public function getListeFolders()
	{
		return $this->liste_folders;
	}

	public function getListeFoldersId()
	{
		return $this->liste_folders_id;
	}

	public function getListeBS()
	{
		return $this->liste_bs;
	}

	public function setListeBS($i,$j,$k)
	{
		$this->liste_bs = array($i,$j,$k);
		return $this;
	}

	public function setListeBSAuto()
	{
		$db = new Application_Model_HistoVenteTable();
		$liste_produits = $this->getProduits();
		$liste_nombre_vente = array(-1,-1,-1);
		$day_ago = strftime("%Y-%m-%d %T", mktime(date('H'), date('i'), date('s'), date('m'), date('d')-1, date('Y')));

		foreach($liste_produits as $p)
		{
			$rows = $db->fetchAll($db->select()->where('id_produit = ?',$p->getIdProduit())->where('date < ?',$day_ago));
			if(count($rows)>$liste_nombre_vente[0])
			{
				$liste_nombre_vente[0] = $p->getIdProduit();
			}
			else if(count($rows)>$liste_nombre_vente[1])
			{
				$liste_nombre_vente[1] = $p->getIdProduit();
			}
			else if(count($rows)>$liste_nombre_vente[2])
			{
				$liste_nombre_vente[2] = $p->getIdProduit();
			}
		}
		if($liste_nombre_vente[0] == -1 || $liste_nombre_vente[1] == -1 || $liste_nombre_vente[2] == -1)
		{
			foreach($liste_produits as $p)
			{
				$rows = $db->fetchAll($db->select()->where('id_produit = ?',$p->getIdProduit()));
				if(count($rows)>$liste_nombre_vente[0])
				{
					$liste_nombre_vente[0] = $p->getIdProduit();
				}
				else if(count($rows)>$liste_nombre_vente[1])
				{
					$liste_nombre_vente[1] = $p->getIdProduit();
				}
				else if(count($rows)>$liste_nombre_vente[2])
				{
					$liste_nombre_vente[2] = $p->getIdProduit();
				}
			}
		}
		$this->liste_bs = $liste_nombre_vente;
		return $this;
	}

	public function setBSAuto($bool)
	{
		$this->bs_auto = $bool;
		return $this;
	}

	public function getBSAuto()
	{
		return $this->bs_auto;
	}

	public function saveBSAuto()
	{
		$db = new Application_Model_GroupesTable();
		if($this->bs_auto)
		{
			$data = array('bs_auto' => 'TRUE');
		}
		else
		{
			$data = array('bs_auto' => 'FALSE');
		}
		$where = 'id_groupe = '.$this->getID();
		$db->update($data,$where);
		//inscription dans l'historique
		$libelle = "Changement de la gestion des best sellers du groupe ".$this->getName().", passage a ".$this->bs_auto;
		$histo = new Application_Model_HistoSystemElement($libelle);
		$histo->AddToHistoSystem();
		//
		return $this;
	}

	public function saveListeBS()
	{
		$db = new Application_Model_GroupesTable();
		$data = array(
		'bs1' => $this->liste_bs[0],
		'bs2' => $this->liste_bs[1],
		'bs3' => $this->liste_bs[2]
		);
		$where = 'id_groupe = '.$this->getID();
		$db->update($data,$where);
		//inscription dans l'historique
		$libelle = "Changement des best sellers du groupe ".$this->getName();
		$histo = new Application_Model_HistoSystemElement($libelle);
		$histo->AddToHistoSystem();
		//
		return $this;
	}

	public function changeCode($code)
	{
		$db = new Application_Model_GroupesTable();
		$data = array('code' => $code);
		$where = 'id_groupe = '.$this->getID();
		$db->update($data,$where);
		//inscription dans l'historique
		$libelle = "Changement du code du groupe ".$this->getName()." : le nouveau code est ".$code;
		$histo = new Application_Model_HistoSystemElement($libelle);
		$histo->AddToHistoSystem();
		//mise Ã  jour du nom dans la variable de SESSION
		$this->setCode($code);
	}

	public function save($nom)
	{
		$table= new Application_Model_GroupesTable();
		//$rows = $table->fetchAll($table->select()->where('nom = ?', $this->nom));
		//if(count($rows)==0)
		//{
		$data=array('nom'=>$nom);
		$table->insert($data);
		$this->getByName($this->nom);
		return $this;
		//}
		/* 	else
		{
		throw new Zend_Exception('Groupe dÃ©jÃ  prÃ©sent dans la base de donnÃ©es.');
		} */

	}

	public function changeName($name)
	{
		$g = new Application_Model_GroupesTable();
		$data = array('nom' => $name);
		$where = 'id_groupe = '.$this->getID();
		$g->update($data,$where);
		//inscription dans l'historique
		$libelle = "Changement de nom du groupe n°".$this->getID()." : passage de ".$this->getName()." à  ".$name.".";
		$histo = new Application_Model_HistoSystemElement($libelle);
		$histo->AddToHistoSystem();
		//mise Ã  jour du nom dans la variable de SESSION
		$this->setName($name);
	}

	public function getProduits()
	{
		$liste = array();
		$db = new Application_Model_ProduitsTable();
		$rows = $db->fetchAll($db->select()->where('id_groupe = ?',$this->getID())->order('nom'));
		foreach($rows as $p)
		{
			$produit = new Application_Model_Produit();
			$produit = $produit->getById($p['id_produit']);
			$liste[] = $produit;
		}
		return $liste;
	}

	public function getInfosProduits()
	{
		$liste_produits = $this->getProduits();

		$this->liste_folder_produits = array();
		$this->liste_nom_produits = array();
		$this->liste_prix = array();
		$this->liste_prix_espece = array();
		$this->liste_prix_special = array();
		$this->liste_folders = array();
		$this->liste_folders_id = array();

		if(count($liste_produits)>0)
		{
			$this->liste_id_produits[] = $liste_produits[0]->getIdProduit();
			$this->liste_folder_produits[] = $liste_produits[0]->getIdType();
			$this->liste_nom_produits[] = $liste_produits[0]->getName();
			$prix = new Application_Model_Prix();
			$prix_espece = new Application_Model_Prix();
			$prix_special = new Application_Model_Prix();
			$prix->getByIds($liste_produits[0]->getIdProduit(),1);
			$prix_espece->getByIds($liste_produits[0]->getIdProduit(),2);
			$prix_special->getByIds($liste_produits[0]->getIdProduit(),3);

			$this->liste_prix[] = $prix->getPrix();
			$this->liste_prix_espece[] = $prix_espece->getPrix();
			$this->liste_prix_special[] = $prix_special->getPrix();
			//$max_id_type = $liste_produits[0]->getIdType();
			//$min_id_type = $liste_produits[0]->getIdType();

			for($i = 1; $i<count($liste_produits); $i++)
			{
				$this->liste_id_produits[] = $liste_produits[$i]->getIdProduit();
				$this->liste_folder_produits[] = $liste_produits[$i]->getIdType();
				$this->liste_nom_produits[] = $liste_produits[$i]->getName();

				$prix->getByIds($liste_produits[$i]->getIdProduit(),1);
				$prix_espece->getByIds($liste_produits[$i]->getIdProduit(),2);
				$prix_special->getByIds($liste_produits[$i]->getIdProduit(),3);

				$this->liste_prix[] = $prix->getPrix();
				$this->liste_prix_espece[] = $prix_espece->getPrix();
				$this->liste_prix_special[] = $prix_special->getPrix();

				$type_produit = new Application_Model_TypeProduit();
				try {
					$type_produit = $type_produit->getById($liste_produits[$i]->getIdType());
					if (!in_array($type_produit->getId(), $this->liste_folders_id)) {
						$this->liste_folders_id[] = $type_produit->getId();
						$this->liste_folders[] = $type_produit->getName();
					}
				}
				catch(Zend_Exception $e){}
				/* if($liste_produits[$i]->getIdType() > $max_id_type)
				 {
				 $max_id_type = $liste_produits[$i]->getIdType();
				 }
				 else if($liste_produits[$i]->getIdType() < $min_id_type)
				 {
				 $min_id_type = $liste_produits[$i]->getIdType();
				 }*/
			}

			/*$type_produit = new Application_Model_TypeProduit();
			 $type_produit->getById($min_id_type);
			 $this->liste_folders_id[] = $type_produit->getId();
			 $this->liste_folders[] = $type_produit->getName();

			 for($i = $min_id_type+1; $i<=$max_id_type; $i++)
			 {
			 $type_produit = new Application_Model_TypeProduit();
			 try
			 {
			 $type_produit = $type_produit->getById($i);
			 $this->liste_folders_id[] = $type_produit->getId();
			 $this->liste_folders[] = $type_produit->getName();

			 }
			 catch(Zend_Exception $e){}
			 }*/
		}

		$data = array(
		"produits_id" => $this->liste_id_produits,
		"prod_folder" => $this->liste_folder_produits,
		"produits" => $this->liste_nom_produits,
		"prix" => $this->liste_prix,
		"prix_espece" => $this->liste_prix_espece,
		"prix_special" => $this->liste_prix_special,
		"folders_id" => $this->liste_folders_id,
		"folders" => $this->liste_folders,
		"best_sellers" => $this->liste_bs
		);
		return $data;
	}
	
	/**
	 *
	 * Return an instance of Application_Model_Group from
	 * a row of the data base.
	 * @param unknown_type $row
	 * @return the group created from $row
	 */
	public static function getGroupFromRow($row) {
		$group = new self();
		$group->setName($row['nom'])
		->setId($row['id_groupe'])
		->setCode($row['code'])
		->setBSAuto($row['bs_auto'])
		->setListeBS($row['bs1'], $row['bs2'], $row['bs3']);
		return $group;
	}
}